#pragma once
#include "TCharSupport.h"
#include "EpilLexLocation.h"


enum EpilTokenType
{
	ETT_OpSemicolon,
	ETT_Identifier,
	ETT_Decimal,
	ETT_Double,
	ETT_Scientific,
	ETT_Octal,
	ETT_Hexadecimal,
	ETT_String,
	ETT_EndOfStream,

	ETT_OpenParenthese,				// (
	ETT_CloseParenthese,			// )
	ETT_OpenBracket,				// [
	ETT_CloseBracket,				// ]
	ETT_OpenBrace,					// {
	ETT_CloseBrace,					// }

	ETT_OpAdd,						// +
	ETT_OpMinus,					// -
	ETT_OpMultiply,					// *
	ETT_OpDivide,					// /
	ETT_OpPower,					// ^
	ETT_OpMod,						// %
	ETT_OpLength,					// #
	ETT_OpObjectMemberAccess,		// :
	ETT_OpComma,					// ,
	ETT_OpTableMemberAccess,		// .
	ETT_OpStringConcatenate,		// ..
	ETT_OpVariousParameters,		// ...
	ETT_OpLessThan,					// <
	ETT_OpLessThanOrEqual,			// <=
	ETT_OpGreaterThan,				// >
	ETT_OpGreaterThanOrEqual,		// >=
	ETT_OpAssign,					// =
	ETT_OpEqual,					// ==
	ETT_OpUnequal,					// ~=

	ETT_KwDo,
	ETT_KwEnd,
	ETT_KwWhile,
	ETT_KwRepeat,
	ETT_KwUntil,
	ETT_KwIf,
	ETT_KwThen,
	ETT_KwElseif,
	ETT_KwElse,
	ETT_KwFor,
	ETT_KwIn,
	ETT_KwFunction,
	ETT_KwLocal,
	ETT_KwReturn,
	ETT_KwBreak,
	ETT_KwContinue,
	ETT_KwNil,
	ETT_KwTrue,
	ETT_KwFalse,
	ETT_KwAnd,
	ETT_KwOr,
	ETT_KwNot,
	
	ETT_MAXCOUNT,
	ETT_InvalidType
};


struct EpilToken
{
	EpilToken()
		: type( ETT_InvalidType )
		, text( t("") )
		, location( 0, 0 )
	{
	}

	EpilToken( const EpilToken & token )
		: location( token.location )
		, type( token.type )
		, text( token.text )
	{
	}

	EpilToken( EpilTokenType type, const EpilLexLocation & location, const tstring & text = t("") )
		: type( type )
		, text( text )
		, location( location )
	{
	}

	EpilToken & operator=( const EpilToken & rhs )
	{
		this->location = rhs.location;
		this->type = rhs.type;
		this->text = rhs.text;
		return *this;
	}

	EpilLexLocation location;
	EpilTokenType type;
	tstring text;
};